package RateService

import (
	RateModel "blog/app/models/rate_model"
	"blog/utils"
	"blog/utils/tools"
	"fmt"
	"log"
	"strconv"
	"time"
)

// 自动化操作

// 自动从汇率表取出 cny-usd 的汇率,每个日期只有一条数据

func GetCnyUsdRate() {
	// 1 依次从汇率表获取数据,每次获取100条
	var rateData []RateModel.RateRecord
	db := utils.MySqlDB.Model(&RateModel.RateRecord{}).
		Where("from_code = 'CNY' AND to_code = 'USD'").
		Limit(100000).Order("id asc")
	err := db.Find(&rateData).Error
	if err != nil {
		fmt.Println("取出数据失败", err)
	}
	fmt.Println(rateData)
	// 插入表
	var cnyUsd []RateModel.CnyUsd
	var usdCny []RateModel.UsdCny
	for _, rateItem := range rateData {
		fmt.Println(rateItem)
		cnyUsd = append(cnyUsd, RateModel.CnyUsd{
			Rate:        rateItem.Rate,
			RateDate:    rateItem.RateDate,
			CreatedTime: time.Now(),
			UpdatedTime: time.Now(),
		})
		// 同时反向计算美元转人民币汇率
		//1 字符串转float
		rateFloat, _ := strconv.ParseFloat(rateItem.Rate, 64)
		fmt.Println("1 字符串转float", rateFloat)
		// 2 计算美元汇率
		usdRate := 1 / rateFloat
		fmt.Println("2 计算美元汇率", usdRate)
		// 3 float转字符串
		rateFloatStr := fmt.Sprintf("%.4f", usdRate)
		usdCny = append(usdCny, RateModel.UsdCny{
			Rate:        rateFloatStr,
			RateDate:    rateItem.RateDate,
			CreatedTime: time.Now(),
			UpdatedTime: time.Now(),
		})
	}
	// 批量插入数据
	err = utils.MySqlDB.CreateInBatches(cnyUsd, 100).Error
	if err != nil {
		fmt.Println("批量插入数据 人民币转美元 失败", err)
	}
	err = utils.MySqlDB.CreateInBatches(usdCny, 100).Error
	if err != nil {
		fmt.Println("插入美元转人民币汇率失败", err)
	}
}

// CheckRateFull 自动检查cny-usd汇率数据的完整性
func CheckRateFull(fromCode, toCode, fromDate, toDate string) {
	// 根据开始和结束日期生成日期数组
	startTime, _ := tools.TryParseTime(fromDate)
	fmt.Println(startTime)
	endTime, _ := tools.TryParseTime(toDate)
	fmt.Println(endTime)

	// 遍历日期范围内的每一天
	currentDate := startTime
	for currentDate.Before(endTime) || currentDate.Equal(endTime) {
		// 格式化日期为 YYYY-MM-DD 格式
		dateStr := currentDate.Format("2006-01-02")

		// 查询当前日期是否存在汇率记录
		var count int64
		err := utils.MySqlDB.Model(&RateModel.RateRecord{}).
			Where("from_code = ? AND to_code = ? AND  DATE(rate_date) = ?",
				fromCode, toCode, dateStr).
			Count(&count).Error

		if err != nil {
			fmt.Printf("查询日期 %s 的汇率记录失败: %v\n", dateStr, err)
			continue
		}

		// 如果不存在记录，输出提示信息
		if count == 0 {
			fmt.Printf("日期 %s 缺少汇率数据\n", dateStr)
			// log.Println("开始获取数据写入mysql,开始日期" + startDate + "结束日期:" + endDate)
			log.Printf("日期 %s 缺少汇率数据\n", dateStr)
		}

		// 移动到下一天
		currentDate = currentDate.AddDate(0, 0, 1)
	}
}
